XuQi's Blog

  • 首页

  • 归档

使用oss 实现树莓派摄像头采集

发表于 2018-05-17 更新于 2019-10-20

树莓派摄像头

树莓派摄像头模块没有/dev/video0设备节点的问题

/etc/下面的modules-load.d/rpi-camera.conf
打开文件在里面添加一行 bcm2835-v4l2
重启就会在/dev/下面发现video0设备节点了

安装oss sdk

pip install oss2

创建live_channel

https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/examples/live_channel.py?spm=a2c4g.11186623.2.37.ibKSTt&file=live_channel.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# -*- coding: utf-8 -*-

import os
import time

import oss2


# 以下代码展示了视频直播相关接口的用法。


# 首先初始化AccessKeyId、AccessKeySecret、Endpoint等信息。
# 通过环境变量获取,或者把诸如“<您的AccessKeyId>”替换成真实的AccessKeyId等。
#
# 以杭州区域为例,Endpoint是:
# http://oss-cn-shenzhen.aliyuncs.com 或
# https://oss-cn-shenzhen.aliyuncs.com
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', 'LTAI4oPl28gTR8pH')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', 'dg3FXdjjn94p4BMKRbTpO6ryaNfrBn')
bucket_name = os.getenv('OSS_TEST_BUCKET', 'live-move')
endpoint = os.getenv('OSS_TEST_ENDPOINT', 'oss-cn-shanghai.aliyuncs.com')


# 确认上面的参数都填写正确了
for param in (access_key_id, access_key_secret, bucket_name, endpoint):
assert '<' not in param, '请设置参数:' + param


# 创建Bucket对象,所有直播相关的接口都可以通过Bucket对象来进行
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)


# 创建一个直播频道。
# 频道的名称是test_rtmp_live。直播生成的m3u8文件叫做test.m3u8,该索引文件包含3片ts文件,每片ts文件的时长为5秒(这只是一个建议值,具体的时长取决于关键帧)。
channel_name = 'test_rtmp_live'
playlist_name = 'test.m3u8'
create_result = bucket.create_live_channel(
channel_name,
oss2.models.LiveChannelInfo(
status = 'enabled',
description = '测试使用的直播频道',
target = oss2.models.LiveChannelInfoTarget(
playlist_name = playlist_name,
frag_count = 3,
frag_duration = 5)))

# 创建直播频道之后拿到推流用的play_url(rtmp推流的url,如果Bucket不是公共读写权限那么还需要带上签名,见下文示例)和观流用的publish_url(推流产生的m3u8文件的url)。
publish_url = create_result.publish_url
play_url = create_result.play_url

# 创建好直播频道之后调用get_live_channel可以得到频道相关的信息。
get_result = bucket.get_live_channel(channel_name)
print(get_result.description)
print(get_result.status)
print(get_result.target.type)
print(get_result.target.frag_count)
print(get_result.target.frag_duration)
print(get_result.target.playlist_name)

# 拿到推流地址和观流地址之后就可以向OSS推流和观流。如果Bucket的权限不是公共读写,那么还需要对推流做签名,如果Bucket是公共读写的,那么可以直接用publish_url推流。
# 这里的expires是一个相对时间,指的是从现在开始这次推流过期的秒数。
# params是一个dict类型的参数,表示用户自定义的参数。所有的参数都会参与签名。
# 拿到这个签过名的signed_url就可以使用推流工具直接进行推流,一旦连接上OSS之后超过上面的expires流也不会断掉,OSS仅在每次推流连接的时候检查expires是否合法。
expires = 3600
signed_url = bucket.sign_rtmp_url(channel_name, playlist_name, expires)

# 创建好直播频道,如果想把这个频道禁用掉(断掉正在推的流或者不再允许向一个地址推流),应该使用put_live_channel_status接口,将频道的status改成“disabled”,如果要将一个禁用状态的频道启用,那么也是调用这个接口,将status改成“enabled”。
bucket.put_live_channel_status(channel_name, 'enabled')
bucket.put_live_channel_status(channel_name, 'disabled')

# 对创建好的频道,可以使用LiveChannelIterator来进行列举已达到管理的目的。
# prefix可以按照前缀过滤list出来的频道。
# max_keys表示迭代器内部一次list出来的频道的最大数量,这个值最大不能超过1000,不填写的话默认为100。

prefix = ''
max_keys = 1000

for info in oss2.LiveChannelIterator(bucket, prefix, max_keys=max_keys):
print(info.name)

# 对于正在推流的频道调用get_live_channel_stat可以获得流的状态信息。
# 如果频道正在推流,那么stat_result中的所有字段都有意义。
# 如果频道闲置或者处于“disabled”状态,那么status为“Idle”或“Disabled”,其他字段无意义。
stat_result = bucket.get_live_channel_stat(channel_name)
print(stat_result.status)
print(stat_result.remote_addr)
print(stat_result.connected_time)
print(stat_result.video)
print(stat_result.audio)

print(publish_url)

# 如果想查看一个频道历史推流记录,可以调用get_live_channel_history。目前最多可以看到10次推流的记录
#history_result = bucket.get_live_channel_history(channel_name)
#print(len(history_result.records))

# 如果希望利用直播推流产生的ts文件生成一个点播列表,可以使用post_vod_playlist方法。
# 指定起始时间为当前时间减去60秒,结束时间为当前时间,这意味着将生成一个长度为60秒的点播视频。
# 播放列表指定为“vod_playlist.m3u8”,也就是说这个接口调用成功之后会在OSS上生成一个名叫“vod_playlist.m3u8”的播放列表文件。

#end_time = int(time.time()) - 60
#start_time = end_time - 3600
#bucket.post_vod_playlist(channel_name,
playlist_name,
start_time = start_time,
end_time = end_time)

# 如果一个直播频道已经不打算再使用了,那么可以调用delete_live_channel来删除频道。
#bucket.delete_live_channel(channel_name)

生成的channel url

1
2
3
4
5
6
7
rtmp://live-move.oss-cn-shanghai.aliyuncs.com/live/test_rtmp_live

ffmpeg -f video4linux2 -i /dev/video0 -f flv rtmp://live-move.oss-cn-shanghai.aliyuncs.com/live/test_rtmp_live

ffmpeg -ss 0 -i /dev/video0 -f flv “rtmp://live-move.oss-cn-shanghai.aliyuncs.com/live/test_rtmp_live”

ffmpeg -f video4linux2 -i /dev/video0 -f flv rtmp://live-move.oss-cn-shanghai.aliyuncs.com/live/test_rtmp_live
# 树莓派
使用服务器推送技术实现在线视频
Esp8266和HomeKit
  • 文章目录
  • 站点概览

XuQi

44 日志
30 标签
  1. 1. 树莓派摄像头
    1. 1.1. 树莓派摄像头模块没有/dev/video0设备节点的问题
  2. 2. 安装oss sdk
  3. 3. 创建live_channel
  4. 4. 生成的channel url
© 2019 XuQi
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Muse v7.3.0